SnowflakeでSAML認証を使用したシングルサインオン(SSO)を設定する(Auth0編) #SnowflakeDB
Snowflakeでは、標準のユーザー名/パスワードでの認証に加えて、SAML認証を使用したシングルサインオン(SSO)を設定することが可能です。SAMLのIdentity provider (IdP)としてSnowflakeがネイティブにサポートしているのはOktaとADFSの2つですが、これ以外でもSAML2.0に対応したサービスであればSAML IdPとして利用可能です。
今回は、SAML IdPにAuth0を利用してSnowflakeでSSOを設定する方法をご紹介します。
目次
前提条件
SnowflakeおよびAuth0のアカウントは登録済みの前提で話を進めます。いずれも無料トライアルが可能です。
Auth0側の設定
Auth0側では以下を設定します。
- アプリケーション作成
- SAMLアドオンの設定
- Auth0の証明書とログインURL(SAMLリクエストの送信先URL)の確認
- ユーザー作成
アプリケーション作成
はじめにAuth0で「アプリケーション」を作成します。
Auth0の管理コンソールの左サイドメニューから「Applications」を選択し、「+ CREATE APPLICATION」ボタンを押下します。
アプリケーションに任意の名前をつけます。アプリケーションのタイプは「Regular Web App」を選択し「CREATE」をボタンを押下します。
SAMLアドオンの設定
Snowflakeのオンラインドキュメントでは、OktaまたはADFSをSAML IdPとして設定する手順が詳細に記載されています。またSnowflakeのコミュ二ティサイトのナレッジベースに、SnowflakeのSSOに必要なSAMLアサーションの属性情報が記載されています。これらを参考にAuth0をSAML IdPとして設定していきます。
- Federated Authentication & SSO — Snowflake Documentation
- HowTo: Configure your IDP to Snowflake by providing required attributes in a SAML Response
「Addons」タブを選択し、「SAML2 WEB APP」を有効化します。
以下のような「SAML2 Web App」の設定画面が表示されます。
「Application Callbak URL」には以下を設定します。
- リージョンがUS Westの場合:
https://<account_name>.snowflakecomputing.com/fed/login
- その他のリージョン:
https://<account_name>.<region_id>.snowflakecomputing.com/fed/login
「Settings」は以下のように設定します。
audience
に以下のURLを指定します。- リージョンがUS Westの場合:
https://<account_name>.snowflakecomputing.com
- その他のリージョン:
https://<account_name>.<region_id>.snowflakecomputing.com
- リージョンがUS Westの場合:
recipient
に以下のURLを指定します。- リージョンがUS Westの場合:
https://<account_name>.snowflakecomputing.com/fed/login
- その他のリージョン:
https://<account_name>.<region_id>.snowflakecomputing.com/fed/login
- リージョンがUS Westの場合:
- アサーションへの署名に使用する署名アルゴリズムに
rsa-sha256
を、SAMLメッセージに署名するために使用するダイジェスト・アルゴリズムにsha256
を指定します。 - Snowflakeでは、「SAMLアサーションの
NameID
の値」と「Snowflakeで登録されているユーザーのLogin Name
の値」とでユーザーのマッチングを行います。- 今回はメールアドレスでユーザーのマッチングを行う設定とします。具体的には、Snowflake側ではユーザーの
Login Name
にメールアドレスを登録し、Auth0側ではSAMLアサーションのNameID
にAuth0ユーザーのメールアドレスをセットします。 - このための設定を
mappings
で行います(※デフォルトではNameID
にはuser_id
がセットされるので、これをemail
に変更します)。
- 今回はメールアドレスでユーザーのマッチングを行う設定とします。具体的には、Snowflake側ではユーザーの
{ "audience": "https://XXXXXXX.ap-southeast-1.snowflakecomputing.com", "recipient": "https://XXXXXXX.ap-southeast-1.snowflakecomputing.com/fed/login", "mappings": { "email": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier" }, "signatureAlgorithm": "rsa-sha256", "digestAlgorithm": "sha256" }
別の例として、ユーザー名(name
)でユーザーのマッチングを行いたい場合は、Snowflake側ではユーザーのLogin Name
にAuth0と同じユーザー名を登録し、
Auth0側ではSAMLアサーションのNameID
にAuth0ユーザーのユーザー名をセットします
{ "audience": "https://XXXXXXX.ap-southeast-1.snowflakecomputing.com", "recipient": "https://XXXXXXX.ap-southeast-1.snowflakecomputing.com/fed/login", "mappings": { "name": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier" }, "signatureAlgorithm": "rsa-sha256", "digestAlgorithm": "sha256" }
「SAVE」ボタンを押下して設定を保存します。
「DEBUG」ボタンを押下すると、生成されるSAMLアサーションの内容を確認できます。
SignedInfo
で、署名アルゴリズムがrsa-sha256
、ダイジェスト・アルゴリズムがsha256
になっていることを確認します。
<SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> <Reference URI="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"> <Transforms> <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> <DigestValue>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</DigestValue> </Reference> </SignedInfo>
saml:Subject
で、NameID
にユーザーのメールアドレスがセットされていることを確認します。またRecipient
がhttps://<account_name>.snowflakecomputing.com/fed/login
(またはhttps://<account_name>.<region_id>.snowflakecomputing.com/fed/login
)になっていることを確認します。
<saml:Subject> <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">yawata.yutaka@XXXXXX.XXX</saml:NameID> <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"> <saml:SubjectConfirmationData NotOnOrAfter="2019-11-03T10:16:28.976Z" Recipient="https://yq99039.ap-southeast-1.snowflakecomputing.com/fed/login"/> </saml:SubjectConfirmation> </saml:Subject>
saml:Conditions
で、saml:Audience
がhttps://<account_name>.snowflakecomputing.com
(またはhttps://<account_name>.<region_id>.snowflakecomputing.com
)になっていることを確認します。
<saml:Conditions NotBefore="2019-11-03T09:16:28.976Z" NotOnOrAfter="2019-11-03T10:16:28.976Z"> <saml:AudienceRestriction> <saml:Audience>https://XXXXXXX.ap-southeast-1.snowflakecomputing.com</saml:Audience> </saml:AudienceRestriction> </saml:Conditions>
Auth0の証明書とログインURL(SAMLリクエストの送信先URL)の確認
「SAML2 Web App」の設定画面で、以下の2つの情報を取得します(後述の手順でこれらをSnowflake側に登録します)。
- SnowflakeがAuth0からのSAMLアサーションを検証するためのX.509形式の証明書
- SnowflakeからAuth0にSAMLリクエストを送信する際のURLエンドポイント
「SAML2 Web App」の設定画面に戻り、「Usage」をクリックします。 「Identity Provider Certificate」の「Download Auth0 certificate」をクリックして証明書ファイルをダウンロードします。 また、「Identity Provider Login URL」をメモしておきます。
ユーザー作成
Auth0側にユーザーを登録します。
左サイドメニューから「Users & Roles - Users」を選択し、「+ CREATE USER」ボタンを押下します。
メールアドレス、パスワードを入力して「CREATE」ボタンを押下します。
この時点ではユーザーのメールアドレスのverificationが完了していない(メールアドレスのverificationがpendingとなっている)ため、ユーザーが有効化されていない状態です。
登録したメールアドレスにverification用のメールが送信されるので、メール本文中の「VERIFY YOUR ACCOUNT」をクリックしてメールアドレスのverificationを行います。
メールアドレスが「verified」になります。
Snowflake側の設定
Snowflake側では以下を設定します。
- ユーザー作成
- SSOの設定
- SSOのテスト
- SSOの有効化
ユーザー作成
Snowlake側にユーザーを登録します。
ACCOUNTADMIN
権限を持つユーザーでSnowflakeの管理コンソールにログインします。「Switch Role」から「ACCOUNTADMIN」にスイッチします。
「Worksheets」から以下のようにcreate user
を実行します。
create user if not exists ssotestuser password = NULL login_name = 'yawata.yutaka@XXXXXX.XXX' default_role = SAMPLEROLE
password = NULL
でパスワードを無効化します(Auth0経由のSSOのみ可能とする)。Login Name
にはAuth0ユーザーと同じメールアドレスを登録します。(※default_role
の設定はオプションです。)
SSOの設定
- SAML_IDENTITY_PROVIDERパラメーターを設定します。以下の値をJSON形式で指定します。
項目 | 説明 | 必須/オプション |
---|---|---|
certificate | SAMLアサーションを検証するための証明書。Auth0側で発行された証明書を指定する。 証明書はヘッダーとフッターを除いたボディ部を一行で指定する(改行コードが含まれているとエラーとなる場合があるため)。 |
必須 |
ssoUrl | SnowflakeからAuth0にSAMLリクエストを送信する際のURLエンドポイント。Auth0側で発行されたURLを指定する。 | 必須 |
type | IdPの種類。"OKTA"、"ADFS"、"Custom"(Auth0などのその他のIdP)のいずれかを指定する。 | 必須 |
label | Snowflakeのログイン画面に表示されるSSOボタンのテキスト。「Log in using」に続く任意のテキストを指定する(アルファベットと数字のみ指定可能。空白は指定不可)。 | オプション |
具体的には「Worksheets」から以下のようなクエリを実行します。
alter account set saml_identity_provider = '{ "certificate": "XXXXXXXXXXXXXXXXXXX", "ssoUrl": "https://XXXXX.auth0.com/samlp/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "type" : "Custom", "label" : "Auth0" }';
SSOのテスト
SAML_IDENTITY_PROVIDER
パラメーターを設定しただけでは、Snowflakeのログイン画面にSSOのボタンが表示されません。SSOボタンを表示させるためにはsso_login_page
パラメーターをtrue
に設定する必要がありますが、その前にプレビューページを使ってSSOの動作確認を行うことができます。
プレビューページを表示するために、以下のURLにアクセスします。
- リージョンがUS Westの場合:
https://<account_name>.snowflakecomputing.com/console/login?fedpreview=true
- その他リージョン:
https://<account_name>.<region_id>.snowflakecomputing.com/console/login?fedpreview=true
SSOのボタン(Log in using Auth0)を押下します。
Auth0のログイン画面が表示されるので、メールアドレスとパスワードを入力してログインします。
ログインが成功することを確認します(初回ログイン時は以下のような画面が表示されます)。
SSOの有効化
SSOのテストに成功したら、SSOを有効化します(Snowflakeのログイン画面にSSOのボタンを表示させる)。
ACCOUNTADMIN
権限を持つユーザーでSnowflakeにログインします。「Switch Role」から「ACCOUNTADMIN」にスイッチします。
「Worksheets」から以下のクエリを実行し、sso_login_page
パラメーターをtrue
に設定します。
alter account set sso_login_page = true;
通常のコンソールログインURLにアクセスして、プレビューのそれと同様のログイン画面が表示されればSSOの設定完了です。
まとめ
SnowflakeとAuth0とのSAML連携については網羅的な情報が見つからず、かつ私自身のSAMLに関する知識の無さも影響して、Auth0側の正しい設定にたどり着くまでに試行錯誤がありましたが、、結果的には比較的シンプルな設定でSnowflakeとAuth0とのSAML連携が実現できることがわかりました(SAMLに関する理解も深まりました)。
Snowflakeのコミュ二ティサイトのナレッジベースにはSnowflakeと様々なIdPとの連携手順が記載されていますので、こちらも参考になるかと思います。